//uvalive 3713 //zoj 3370
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<iostream>
#include<string>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<stack>
using namespace std;
const double eps= 1e-7;
const int maxn=1305, maxe=3000000;
int first[maxn*2],next[maxe],E[maxe],M;
int dcmp(double x)
{
	return (x>eps)-(x<-eps);
}
void init()
{
	M=-1;
	memset(first,-1,sizeof(first));
}
void insert(int a,int b)
{
	M++;
	next[M]=first[a];
	first[a]=M;
	E[M]=b;	
}

/********************2-sat**************************/
int cnt;//cnt表示总的对数,(也就是cnt*2==2-sat中的点数)
int q[maxn*2],fr,ed;
int vis[maxn],sel[2*maxn],flag,cas;
//sel表示选取的是哪个，如果i为1就表示选i,i与op[i]值相反
int to[2*maxn],op[2*maxn];//to表示现在的两个数对应的是第几位，op表示反向
void satinit(int n)//初始化2-sat，传入有多少对
{
	int i,j;
	for(i=0,j=0; i<n; i++)//从0到cnt-1是正点,cnt到2*cnt-1是反点
	{
		to[j]=i;
		to[j+n]=i;
		op[j]=j+n;
		op[j+n]=j;
		j++;
	}
	cnt=n;//给2-sat的对数赋值,2-sat的点数为cnt*2
}
void dfs(int u)
{
	if (!flag) return;
	q[ed++]=to[u];
	vis[to[u]] = cas;
	sel[u]=1;
	sel[op[u]]=0;
	for (int e=first[u];e!=-1; e=next[e])
	{
	    int v = E[e];
	    if (vis[to[v]]<cas) dfs(E[e]);
	    else if (sel[op[v]])
	    {
	        flag=0;
	        vis[to[v]] = cas-1;
	        return;
	    }
	}
}
bool solve()
{
	cas++;
	memset (sel, 0, sizeof(sel));
	fr=ed=0;
	for (int i=0; i<cnt; i++) 
	if (vis[i]<cas)
	{
	    flag=1;
	    dfs(i);
	    if (!flag)
	    {
	        while (fr<ed)
	        {
	            vis[q[fr++]]=cas-1;
	        }
	        flag=1;
	        dfs(op[i]);
	        if (!flag) return false;
	    }
	}
	return true;
}
/********************2-sat**************************/

struct node
{
	double x,y;
	void rd()
	{	scanf("%lf%lf",&x,&y);
	}
}p[2000];
double dist(node a,node b)
{
	double x,y;
	x=a.x-b.x;y=a.y-b.y;
	return sqrt(x*x+y*y);
}
int n;
int main()
{	
	#ifndef ONLINE_JUDGE
	freopen("in","r",stdin);
	//freopen("out","w",stdout);
#endif
	int i,j,k;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0; i<n; i++)	
			p[i].rd();
		double l=0,r=0;
		for(i=0; i<n; i++)
		for(j=i+1; j<n; j++)
		{
			r=max(r,dist(p[i],p[j]));
		}
		satinit(n);
		double mid,ans=0;
		k=1000;
		while(r-l>=eps)
		{
			mid=(l+r)/2;
			init();
			for(i=0; i<n;i++)
			for(j=i+1; j<n; j++)
			{
				if(dcmp(dist(p[i],p[j]) - mid)<=0)
				{
					insert(i,op[j]);
					insert(j,op[i]);
					insert(op[i],j);
					insert(op[j],i);
				}
			}
			if(solve())
			{
				ans=mid;
				l=mid;
			}
			else
			{
				r=mid;
			}
		}
		init();
		for(i=0; i<n;i++)
		for(j=i+1; j<n; j++)
		{
			if(dcmp(dist(p[i],p[j]) - ans)<=0)
			{
				insert(i,op[j]);
				insert(j,op[i]);
				insert(op[i],j);
				insert(op[j],i);
			}
		}
		solve();
		printf("%.6lf\n",ans/2);
		for(i=0; i<n-1; i++)
		{
			if(sel[i])
				printf("%d ",1);
			else 
				printf("%d ",2);
		}
		if(sel[i])
			printf("%d\n",1);
		else 
			printf("%d\n",2);
		
	}
}

